var initFn = (function(){
    //  默认赋值会影响函数长度
    // function test(a, b, c = 1, d, e){}
    // console.log(test.length);

    // 当形参赋默认值时，arguments映射关系会受到响应影响
    function test(a, b, c = 1, d, e){
        arguments[1] = 7;
        console.log(arguments);
    }
    console.log(test.length);

    // 练习题
    var x = 1;
    function foo(x, y = function(){
        x = 2;
        console.log(x);
    }){
        var x = 3;
        y();
        console.log(x);
    }

    foo();
    console.log(x);
});

var initThis = (function(){
    // 1、默认绑定规则 => window(除开严格模式)
    function a(){
        'use strict';
        console.log(this);
    }
    a();

    // 2、隐式绑定，谁调用就指向谁
    let obj = {
        a: 2,
        foo: foo
    }
    function foo(){
        console.log(this);
    }
    obj.foo();

    // 3、显式绑定call,apply,bind
    // 4、new改变this指向=>实例化对象
});
var initJianTou = (function(){
    // 一个参数
    var f = a => a;
    console.log(f(1));

    // 箭头函数的缺陷
    // 在箭头函数中，不存在arguments

    let sum = (c, d) => {
        // console.log(arguments); // 报错
        return c + d;
    }
    sum(1, 2);

    // ... spread / rest 运算符：（展开或是收集）

    // 收集
    let add = (...args) => {
        console.log(args);
        console.log(args[0] + args[1]);
    }

    add(1, 2);

    // 展开
    function foo(x, y, z){
        console.log(x, y, z);
    }
    foo(...[1, 2, 3]);
    // foo.apply(null, [1, 2, 3]);

    let b = [4, 5];
    let a = [1, 2, 3, ...b];
    console.log(a);

    // 收集只能放在最后
    let fn = (a, b, ...c) =>{
        console.log(a, b, c);
    }

    fn(1, 2, 3, 4, 5, 6, 7);

    // es5排序
    // function sortNum(){
    //     var arr = Array.prototype.slice.call(arguments);
    //     return arr.sort(function(a, b){
    //         return a - b;
    //     });
    // }

    //es6排序
    let sortNum = (...args) => args.sort((a, b) => a -b);

    console.log(sortNum(1234,56,54,7,213,4,32,321));

    // 形参长度
    console.log((function (a){}).length);
    // length不会计算c = 0,...b的长度
    console.log((function (a, c = 0, ...b){}).length);
});
var initParam = function(){
    initFn();
    initThis();
    initJianTou();
}

initParam();